package com.example.emos.api.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;


/**
 * Java语言是同步执行的，一句代码没有执行完绝不会执行下一句代码。
 * JavaScript默认也是如此，但是JavaScript里面的Ajax是异步执行的
 * 在一个业务流程中，有时候会有一些耗费时间的分支业务，如果把这些琐碎且不重要的任务用异步执行，那么就可以减轻当前线程的执行压力
 *
 * 如果采用分布式架构，A系统想要把分支任务分配给B系统去执行，通过消息队列来分配任务也是可行的
 * 也算是一种异步执行的方式
 *
 * 为了把任务分配给其他线程，我们首先要配置一个线程池出来
 */
@Configuration
public class ThreadPoolConfig {

    @Bean("AsyncTaskExecutor")
    public AsyncTaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(8);
        // 设置最大线程数
        executor.setMaxPoolSize(16);
        // 设置队列容量
        executor.setQueueCapacity(32);
        // 设置线程活跃时间（秒）
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix("task-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }

}
